package com.ads.proplan.control;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Random;

import android.content.Context;
import android.util.Log;

import com.ads.proplan.db.entity.Pergunta;
import com.ads.proplan.db.entity.SessaoPergunta;

public class FaseControl extends FaseControlAbstract {
	
//===========================================VARIAVEIS===========================================//	
	
	protected static FaseControl uniqueInstance;
	
	private boolean statusBar;
	
	private boolean questionResult;
	
	private Date statusTimeBar;
	
//===========================================ESTADOS===========================================//	
	
	private FaseControl() {	}
	public static FaseControl getInstance() {
		if (uniqueInstance == null) {
			uniqueInstance = new FaseControl();
		}
		return (FaseControl) uniqueInstance;
	}

	@Override
	public void initialControl(Context context) {
		setStatusBar(true);
		getJogador(context);
		getUsuario(context);
		getFase(context);
		getListSessaoPergunta(context);
		getListQuestionDb(context);
		selectQuestion();
	}
	
	@Override
	public void restartControl() {
		jogadorEntity.setPulos(3);
		jogadorEntity.setVidas(0);
		jogadorEntity.setQCorretaRodada(0);
		jogadorEntity.setQRodada(0);
		jogadorEntity.setDeltaTempoTopAcerto(0);
		jogadorEntity.setBarraProgresso(arrayListFase.get(jogadorEntity.getFase()-1).getTempo());
	}

	@Override
	public void closeControl() {
		jogadorRepos.update(jogadorEntity);
		uniqueInstance = null;
	}

	@Override
	public void finalizeControl() {
		// TODO Auto-generated method stub
		
	}
	
//===========================================GET AND SET==================================================//
	
	public Pergunta getQuestionEntity() {
		return perguntaEntity;
	}
	
	public void setStatusBar(boolean statusBar) {
		this.statusBar = statusBar;
	}
	
	public boolean isStatusBar() {
		return statusBar;
	}

	public int getProgressBar() {
		return jogadorEntity.getBarraProgresso();
	}
	
	public void setProgressBar(int barraProgresso) {
		jogadorEntity.setBarraProgresso(barraProgresso);
	}
	
	public boolean isQuestionResult(){
		return questionResult;
	}
	
	public void setQuestionResult(boolean result){
		questionResult = result;
	}
	
//===========================================METODOS DE APOIO==============================================//
	
	public ArrayList<String> mixList() {
		ArrayList<String> fileList = new ArrayList<String>();
		if(perguntaEntity.getAlternative1() != null)
			fileList.add(perguntaEntity.getAlternative1());
		if(perguntaEntity.getAlternative2() != null)
			fileList.add(perguntaEntity.getAlternative2());
		if(perguntaEntity.getAlternative3() != null)
			fileList.add(perguntaEntity.getAlternative3());
		if(perguntaEntity.getAlternative4() != null)
			fileList.add(perguntaEntity.getAlternative4());
		if(perguntaEntity.getAlternative5() != null)
			fileList.add(perguntaEntity.getAlternative5());
		if(perguntaEntity.getAlternative6() != null)
			fileList.add(perguntaEntity.getAlternative6());
		long seed = System.nanoTime();
		Collections.shuffle(fileList, new Random(seed));
		return fileList;
	}
	
	public void verifyCorrectAlternative(ArrayList<String> adapter, int selectedId) {
		String resposta = adapter.get(selectedId);
		if (perguntaEntity.getAlternative1().equalsIgnoreCase(resposta)) {
			setQuestionResult(true);
			if (getLifeNumber() > 0) {
				//control.setLifeNumber(control.getLifeNumber() - 1);
			}
		} else {
			setLifeNumber(getLifeNumber() + 1);
			setQuestionResult(false);
		}
		setSessaoQuestion();
	}
	
	public void setSessaoQuestion(){
		int diffSeconds = diffSecondBarTime(); 
		jogadorEntity.setQRodada(jogadorEntity.getQRodada()+1);
		sessaoPerguntaEntity = new SessaoPergunta();
		sessaoPerguntaEntity.setData(new Date());
		if(questionResult){
			jogadorEntity.setQCorretaRodada(jogadorEntity.getQCorretaRodada()+1);
			sessaoPerguntaEntity.setIsAcerto(1);
		}else{
			//jogadorEntity.setPontos(jogadorEntity.getPontos() + 1);
			sessaoPerguntaEntity.setIsAcerto(0);
		}
		if((getNumberQuestionsStage()/3) == jogadorEntity.getQCorretaRodada()){
			jogadorEntity.setDeltaTempoTopAcerto(getBarMaxSize()-jogadorEntity.getBarraProgresso());
		}
		sessaoPerguntaEntity.setTempoResolucao(diffSeconds);
		sessaoPerguntaEntity.setPergunta(perguntaEntity.getId());
		sessaoPerguntaRepos.create(sessaoPerguntaEntity);
		questionRepos.update(perguntaEntity);
	}
		
//===========================================METODOS LOGICOS==============================================//
		
	public void addPoints() {
		int topAcerto = (getNumberQuestionsStage()/3);
		int acerto;
		int acertoplus;
		int pular = jogadorEntity.getPulos();
		int deltaT = jogadorEntity.getDeltaTempoTopAcerto();
		int trofeu = 0;
		int total;
		
		if(jogadorEntity.getQCorretaRodada() > topAcerto){
			acerto = topAcerto;
		}else{
			acerto = jogadorEntity.getQCorretaRodada();
		}
		
		if(jogadorEntity.getQCorretaRodada() > topAcerto){
			acertoplus = jogadorEntity.getQCorretaRodada() - topAcerto;
		}else{
			acertoplus = 0;
		}
		
		if(jogadorEntity.getQCorretaRodada() >= topAcerto){
			trofeu = trofeu + 20;
		}
		if(jogadorEntity.getQCorretaRodada() >= (topAcerto*2)){
			trofeu = trofeu + 20;
		}
		if(jogadorEntity.getQCorretaRodada() >= (topAcerto*3)){
			trofeu = trofeu + 20;
		}
		
		Log.i("############", "Pontos: acerto "+acerto+", acertoplus "+acertoplus+", pular "+pular+", deltaT "+deltaT+", trofeu "+trofeu);
		total = ((acerto*10)+(acertoplus*20)+(pular*20)+(deltaT*5)+(trofeu));
		
		jogadorEntity.setPontos(jogadorEntity.getPontos() + total);
		jogadorEntity.setNumeroPartidas(jogadorEntity.getNumeroPartidas()+1);
		jogadorEntity.setPontosRodada(total);
		if(total > jogadorEntity.getMaiorPontuacao()){
			jogadorEntity.setMaiorPontuacao(total);
		}
	}
	
	public void addPointsPartidaPerdida() {
		jogadorEntity.setNumeroPartidas(jogadorEntity.getNumeroPartidas()+1);
		jogadorEntity.setPontosRodada(0);
	}
	
	private int diffSecondBarTime() {
		long diff = (new Date().getTime()) - statusTimeBar.getTime();
		//long diffSeconds = diff / 1000 % 60;
		return (int) diff;
	}
	
	protected void selectQuestion() {
		boolean repetido = true;
		Random gerador = new Random();
		while (repetido) {
			int cont = 0;
			for (Pergunta p : arrayListQuestions) {
				if(p.getRespondida() != 0){
					cont++;
				}
			}
			if (arrayListQuestions.size() == cont) {
				QuestionResolvedClean();
				mixList(arrayListQuestions);
			}
			cont = 0;
			int index = gerador.nextInt(arrayListQuestions.size());
			perguntaEntity = arrayListQuestions.get(index);
			if (perguntaEntity.getRespondida() == 0) {
				arrayListQuestions.get(index).setRespondida(1);
				repetido = false;
			}
		}
	}
	
	public void statusTimeInicial(){
		statusTimeBar = new Date();
	}
	
}
